import pandas as pd
pd.set_option('display.expand_frame_repr', False)
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
font = {'size' : 20}
matplotlib.rc('font', **font)
import seaborn as sns
from pylab import rcParams
rcParams["figure.figsize"] = 30,16
import sklearn
from sklearn import metrics
import numpy as np
import scipy
import datetime as dt
from datetime import date
from collections import OrderedDict
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import warnings
warnings.filterwarnings("ignore")
import sys
sys.path.insert(0, "../")
import functions
#Daten aus jeweiliger CSV-Datei laden
df_rise = pd.read_csv("Datenbeschaffung/kalender.csv", index_col=0, parse_dates=True, usecols=[0,0])
df_rise = df_rise.join(pd.read_csv("Datenbeschaffung/stuttgart.csv", index_col=0, parse_dates=True, usecols=[0,8], squeeze=True).rename("stuttgart"))
df_rise = df_rise.join(pd.read_csv("Datenbeschaffung/freiburg.csv", index_col=0, parse_dates=True, usecols=[0,8], squeeze=True).rename("freiburg"))
df_rise = df_rise.join(pd.read_csv("Datenbeschaffung/mannheim.csv", index_col=0, parse_dates=True, usecols=[0,8], squeeze=True).rename("mannheim"))
df_rise = df_rise.join(pd.read_csv("Datenbeschaffung/ulm.csv", index_col=0, parse_dates=True, usecols=[0,8], squeeze=True).rename("ulm"))
#Uhrzeiten in DateTime konvertieren
df_rise["stuttgart"] = pd.to_datetime(pd.to_datetime(df_rise["stuttgart"]).dt.strftime("1970-01-01 %H:%M:%S"))
df_rise["freiburg"] = pd.to_datetime(pd.to_datetime(df_rise["freiburg"]).dt.strftime("1970-01-01 %H:%M:%S"))
df_rise["mannheim"] = pd.to_datetime(pd.to_datetime(df_rise["mannheim"]).dt.strftime("1970-01-01 %H:%M:%S"))
df_rise["ulm"] = pd.to_datetime(pd.to_datetime(df_rise["ulm"]).dt.strftime("1970-01-01 %H:%M:%S"))
#Uhrzeit in Sekunden am Tag umrechnen
df_rise["stuttgart_sekunden"] = pd.to_timedelta(pd.to_datetime(df_rise["stuttgart"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
df_rise["freiburg_sekunden"] = pd.to_timedelta(pd.to_datetime(df_rise["freiburg"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
df_rise["mannheim_sekunden"] = pd.to_timedelta(pd.to_datetime(df_rise["mannheim"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
df_rise["ulm_sekunden"] = pd.to_timedelta(pd.to_datetime(df_rise["ulm"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
#Durchschnitt der Sekunden am Tag
df_rise["durchschnitt_sekunden"] = round((df_rise["stuttgart_sekunden"] + df_rise["freiburg_sekunden"] + df_rise["mannheim_sekunden"] + df_rise["ulm_sekunden"]) / 4, 0)
#Durchschnitt der Uhrzeit berechnen
df_rise["durchschnitt"] = pd.to_datetime(df_rise["durchschnitt_sekunden"], unit="s")
print(df_rise)
stuttgart freiburg mannheim ulm stuttgart_sekunden freiburg_sekunden mannheim_sekunden ulm_sekunden durchschnitt_sekunden durchschnitt datum 2015-01-01 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2015-01-02 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2015-01-03 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2015-01-04 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2015-01-05 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 ... ... ... ... ... ... ... ... ... ... ... 2021-12-27 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2021-12-28 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2021-12-29 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2021-12-30 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 2021-12-31 1970-01-01 08:16:00 1970-01-01 08:18:00 1970-01-01 08:22:00 1970-01-01 08:11:00 29760.0 29880.0 30120.0 29460.0 29805.0 1970-01-01 08:16:45 [2557 rows x 10 columns]
Aus meteorologischen Gründen folgt der Sonnenaufgang einer ganz klaren jährlichen Saisonalität und die Abstände zwischen den Städten sind stets fast exakt gleich, wobei sie sich aufgrund der räumlichen Nähe nur um wenige Minuten unterscheiden.
fig, ax = plt.subplots()
#Daten für jede Stadt und Durchschnitt plotten
ax.plot(df_rise["durchschnitt"], label="Durchschnitt")
ax.plot(df_rise["stuttgart"], label="Stuttgart");
ax.plot(df_rise["freiburg"], label="Freiburg");
ax.plot(df_rise["mannheim"], label="Mannheim");
ax.plot(df_rise["ulm"], label="Ulm");
#Achsen und Layout
ax.set_title("Sonnenaufgang in allen Städten (2015 - 2021)")
ax.set_ylabel("Uhrzeit")
ax.yaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.yaxis.set_minor_formatter(mdates.DateFormatter("%H:%M"))
ax.set_xlabel("Datum")
ax.set_xlim(dt.datetime(2015,1,1), dt.datetime(2021,12,31))
#Legende einfügen
handles, labels = plt.gca().get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys(), loc="lower left", bbox_to_anchor=(0,-0.15), ncol=4)
plt.show()
for year in [2015, 2016, 2017, 2018, 2019, 2020, 2021]:
print("\n\n", str(year), "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n")
#Untere und obere Grenze zum Filtern des DataFrames nach jeweiligem Jahr
lower_border = str(year) + "-01-01"
upper_border = str(year) + "-12-31"
fig, ax = plt.subplots()
#Daten für jede Stadt und Durchschnitt plotten
ax.plot(df_rise[lower_border:upper_border]["durchschnitt"], label="Durchschnitt");
ax.plot(df_rise[lower_border:upper_border]["stuttgart"], label="Stuttgart");
ax.plot(df_rise[lower_border:upper_border]["freiburg"], label="Freiburg");
ax.plot(df_rise[lower_border:upper_border]["mannheim"], label="Mannheim");
ax.plot(df_rise[lower_border:upper_border]["ulm"], label="Ulm");
#Achsen und Layout
ax.set_title("Sonnenaufgang in allen Städten (" + str(year) + ")")
ax.set_ylabel("Uhrzeit")
ax.yaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.yaxis.set_minor_formatter(mdates.DateFormatter("%H:%M"))
ax.set_xlim(dt.datetime(year,1,1), dt.datetime(year,12,31))
ax.set_xlabel("Datum")
#Legende einfügen
handles, labels = plt.gca().get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys(), loc="lower left", bbox_to_anchor=(0,-0.15), ncol=4)
plt.show()
2015 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2016 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2017 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2018 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2019 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2020 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2021 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Dementsprechend korrelieren die Werte perfekt miteinander.
#Heatmap der Korrelationen untereinander (Pearson)
ax = sns.heatmap(data=df_rise.iloc[:,5:10].corr(method="pearson"), annot=True, vmin=0, vmax=1, cmap="rocket_r");
ax.set_title("Pearson")
ax.xaxis.set_ticks_position("top")
plt.show()
#Heatmap der Korrelationen untereinander (Spearman)
ax = sns.heatmap(data=df_rise.iloc[:,5:10].corr(method="spearman"), annot=True, vmin=0, vmax=1, cmap="rocket_r");
ax.set_title("Spearman")
ax.xaxis.set_ticks_position("top")
plt.show()
#Heatmap der Korrelationen untereinander (Kendall)
ax = sns.heatmap(data=df_rise.iloc[:,5:10].corr(method="kendall"), annot=True, vmin=0, vmax=1, cmap="rocket_r");
ax.set_title("Kendall")
ax.xaxis.set_ticks_position("top")
plt.show()
#Daten aus jeweiliger CSV-Datei laden
df_set = pd.read_csv("Datenbeschaffung/kalender.csv", index_col=0, parse_dates=True, usecols=[0])
df_set = df_set.join(pd.read_csv("Datenbeschaffung/stuttgart.csv", index_col=0, parse_dates=True, usecols=[0,9], squeeze=True).rename("stuttgart"))
df_set = df_set.join(pd.read_csv("Datenbeschaffung/freiburg.csv", index_col=0, parse_dates=True, usecols=[0,9], squeeze=True).rename("freiburg"))
df_set = df_set.join(pd.read_csv("Datenbeschaffung/mannheim.csv", index_col=0, parse_dates=True, usecols=[0,9], squeeze=True).rename("mannheim"))
df_set = df_set.join(pd.read_csv("Datenbeschaffung/ulm.csv", index_col=0, parse_dates=True, usecols=[0,9], squeeze=True).rename("ulm"))
#Uhrzeiten in DateTime konvertieren
df_set["stuttgart"] = pd.to_datetime(pd.to_datetime(df_set["stuttgart"]).dt.strftime("1970-01-01 %H:%M:%S"))
df_set["freiburg"] = pd.to_datetime(pd.to_datetime(df_set["freiburg"]).dt.strftime("1970-01-01 %H:%M:%S"))
df_set["mannheim"] = pd.to_datetime(pd.to_datetime(df_set["mannheim"]).dt.strftime("1970-01-01 %H:%M:%S"))
df_set["ulm"] = pd.to_datetime(pd.to_datetime(df_set["ulm"]).dt.strftime("1970-01-01 %H:%M:%S"))
#Uhrzeit in Sekunden am Tag umrechnen
df_set["stuttgart_sekunden"] = pd.to_timedelta(pd.to_datetime(df_set["stuttgart"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
df_set["freiburg_sekunden"] = pd.to_timedelta(pd.to_datetime(df_set["freiburg"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
df_set["mannheim_sekunden"] = pd.to_timedelta(pd.to_datetime(df_set["mannheim"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
df_set["ulm_sekunden"] = pd.to_timedelta(pd.to_datetime(df_set["ulm"]).dt.strftime("%H:%M:%S")).dt.total_seconds()
#Durchschnitt der Sekunden am Tag
df_set["durchschnitt_sekunden"] = round((df_set["stuttgart_sekunden"] + df_set["freiburg_sekunden"] + df_set["mannheim_sekunden"] + df_set["ulm_sekunden"]) / 4, 0)
#Durchschnitt der Uhrzeit berechnen
df_set["durchschnitt"] = pd.to_datetime(df_set["durchschnitt_sekunden"], unit="s")
print(df_set)
stuttgart freiburg mannheim ulm stuttgart_sekunden freiburg_sekunden mannheim_sekunden ulm_sekunden durchschnitt_sekunden durchschnitt datum 2015-01-01 1970-01-01 16:37:00 1970-01-01 16:46:00 1970-01-01 16:37:00 1970-01-01 16:35:00 59820.0 60360.0 59820.0 59700.0 59925.0 1970-01-01 16:38:45 2015-01-02 1970-01-01 16:38:00 1970-01-01 16:47:00 1970-01-01 16:38:00 1970-01-01 16:36:00 59880.0 60420.0 59880.0 59760.0 59985.0 1970-01-01 16:39:45 2015-01-03 1970-01-01 16:39:00 1970-01-01 16:48:00 1970-01-01 16:39:00 1970-01-01 16:37:00 59940.0 60480.0 59940.0 59820.0 60045.0 1970-01-01 16:40:45 2015-01-04 1970-01-01 16:40:00 1970-01-01 16:49:00 1970-01-01 16:40:00 1970-01-01 16:38:00 60000.0 60540.0 60000.0 59880.0 60105.0 1970-01-01 16:41:45 2015-01-05 1970-01-01 16:41:00 1970-01-01 16:50:00 1970-01-01 16:41:00 1970-01-01 16:40:00 60060.0 60600.0 60060.0 60000.0 60180.0 1970-01-01 16:43:00 ... ... ... ... ... ... ... ... ... ... ... 2021-12-27 1970-01-01 16:33:00 1970-01-01 16:42:00 1970-01-01 16:33:00 1970-01-01 16:31:00 59580.0 60120.0 59580.0 59460.0 59685.0 1970-01-01 16:34:45 2021-12-28 1970-01-01 16:34:00 1970-01-01 16:42:00 1970-01-01 16:33:00 1970-01-01 16:32:00 59640.0 60120.0 59580.0 59520.0 59715.0 1970-01-01 16:35:15 2021-12-29 1970-01-01 16:34:00 1970-01-01 16:43:00 1970-01-01 16:34:00 1970-01-01 16:33:00 59640.0 60180.0 59640.0 59580.0 59760.0 1970-01-01 16:36:00 2021-12-30 1970-01-01 16:35:00 1970-01-01 16:44:00 1970-01-01 16:35:00 1970-01-01 16:34:00 59700.0 60240.0 59700.0 59640.0 59820.0 1970-01-01 16:37:00 2021-12-31 1970-01-01 16:36:00 1970-01-01 16:45:00 1970-01-01 16:36:00 1970-01-01 16:35:00 59760.0 60300.0 59760.0 59700.0 59880.0 1970-01-01 16:38:00 [2557 rows x 10 columns]
Aus selbigen meteorologischen Gründen folgt auch der Sonnenuntergang einer ganz klaren jährlichen Saisonalität und die Abstände zwischen den Städten sind stets fast exakt gleich, wobei sie sich aufgrund der räumlichen Nähe nur um wenige Minuten unterscheiden.
fig, ax = plt.subplots()
#Daten für jede Stadt und Durchschnitt plotten
ax.plot(df_set["durchschnitt"], label="Durchschnitt")
ax.plot(df_set["stuttgart"], label="Stuttgart");
ax.plot(df_set["freiburg"], label="Freiburg");
ax.plot(df_set["mannheim"], label="Mannheim");
ax.plot(df_set["ulm"], label="Ulm");
#Achsen und Layout
ax.set_title("Sonnenaufgang in allen Städten (2015 - 2021)")
ax.set_ylabel("Uhrzeit")
ax.yaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.yaxis.set_minor_formatter(mdates.DateFormatter("%H:%M"))
ax.set_xlabel("Datum")
ax.set_xlim(dt.datetime(2015,1,1), dt.datetime(2021,12,31))
#Legende einfügen
handles, labels = plt.gca().get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys(), loc="lower left", bbox_to_anchor=(0,-0.15), ncol=4)
plt.show()
for year in [2015, 2016, 2017, 2018, 2019, 2020, 2021]:
print("\n\n", str(year), "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n")
#Untere und obere Grenze zum Filtern des DataFrames nach jeweiligem Jahr
lower_border = str(year) + "-01-01"
upper_border = str(year) + "-12-31"
fig, ax = plt.subplots()
#Daten für jede Stadt und Durchschnitt plotten
ax.plot(df_set[lower_border:upper_border]["durchschnitt"], label="Durchschnitt");
ax.plot(df_set[lower_border:upper_border]["stuttgart"], label="Stuttgart");
ax.plot(df_set[lower_border:upper_border]["freiburg"], label="Freiburg");
ax.plot(df_set[lower_border:upper_border]["mannheim"], label="Mannheim");
ax.plot(df_set[lower_border:upper_border]["ulm"], label="Ulm");
#Achsen und Layout
ax.set_title("Sonnenaufgang in allen Städten (" + str(year) + ")")
ax.set_ylabel("Uhrzeit")
ax.yaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.yaxis.set_minor_formatter(mdates.DateFormatter("%H:%M"))
ax.set_xlim(dt.datetime(year,1,1), dt.datetime(year,12,31))
ax.set_xlabel("Datum")
#Legende einfügen
handles, labels = plt.gca().get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys(), loc="lower left", bbox_to_anchor=(0,-0.15), ncol=4)
plt.show()
2015 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2016 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2017 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2018 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2019 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2020 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2021 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Dementsprechend korrelieren die Werte auch hier quasi perfekt miteinander.
#Heatmap der Korrelationen untereinander (Pearson)
ax = sns.heatmap(data=df_set.iloc[:,5:10].corr(method="pearson"), annot=True, vmin=0, vmax=1, cmap="rocket_r");
ax.set_title("Pearson")
ax.xaxis.set_ticks_position("top")
plt.show()
#Heatmap der Korrelationen untereinander (Spearman)
ax = sns.heatmap(data=df_set.iloc[:,5:10].corr(method="spearman"), annot=True, vmin=0, vmax=1, cmap="rocket_r");
ax.set_title("Spearman")
ax.xaxis.set_ticks_position("top")
plt.show()
#Heatmap der Korrelationen untereinander (Kendall)
ax = sns.heatmap(data=df_set.iloc[:,5:10].corr(method="kendall"), annot=True, vmin=0, vmax=1, cmap="rocket_r");
ax.set_title("Kendall")
ax.xaxis.set_ticks_position("top")
plt.show()
Sonnenaufgang und Sonnenuntergang sind aus astronomischen Gründen in allen Städten fasst perfekt miteinander korrelieret. Aus diesem Grund wird im Folgenden nur noch der Sonnenauf- und Sonnenuntergang von Stuttgart stellvertretend für alle Städte beziehungsweise das gesamte Bundesland verwendet. Bei der Berechnung der Tagesstunden ergibt sich kein Unterschied, da die Tage stets gleichlang sind